package com.dt.module.om.util;
import java.sql.*;
import java.util.HashMap;
import java.util.Iterator;

public class JdbcUtil {

  //6.0以上
 //   public static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";

    //
    public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";


    public static boolean checkConnectInfo(String dbUrl,String user,String pass){
        if(dbUrl==null||dbUrl.trim().equals("")){
            return false;
        }
        if(user==null||user.trim().equals("")){
            return false;
        }
        if(pass==null||pass.trim().equals("")){
            return false;
        }
        return true;
    }
    public static String checkConnect(String dbUrl,String user,String pass) {
        StringBuffer result = new StringBuffer();
        if(!checkConnectInfo(dbUrl,user,pass)){
            System.out.println("数据库连接信息错误,db_url:"+dbUrl+",user:"+user+",pass:xxxxx");
            return "数据库连接信息错误,db_url:"+dbUrl+",user:"+user+",pass:xxxxx";
        }
        Connection conn = null;
        Statement stmt = null;
        try{
            // 注册 JDBC 驱动
            Class.forName(JDBC_DRIVER);
            // 打开链接
            System.out.println("连接数据库...,db_url:"+dbUrl);
            result.append("连接数据库...,db_url:"+dbUrl+"\n");
            conn = DriverManager.getConnection(dbUrl,user,pass);
            // 执行查询
            System.out.println("实例化Statement对象...");
            result.append("实例化Statement对象...\n");
            stmt = conn.createStatement();
            String sql = "SELECT now() ntime ";
            ResultSet rs = stmt.executeQuery(sql);
            // 展开结果集数据库
            while(rs.next()){
                // 通过字段检索
                String ntime = rs.getString("ntime");
                System.out.print("当前时间: " + ntime);
                result.append("当前时间: " + ntime+"\n");
            }
            System.out.print("\n");
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 处理 JDBC 错误
            se.printStackTrace();
            result.append(se.getMessage()+"...\n");
        }catch(Exception e){
            // 处理 Class.forName 错误
            e.printStackTrace();
            result.append(e.getMessage()+"...\n");
        }finally{
            // 关闭资源
            try{
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
                result.append(se2.getMessage()+"...\n");
            }// 什么都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
                result.append(se.getMessage()+"...\n");
            }
        }
        System.out.println("goodbye!");
        return result.toString()+"\n\n";
    }
    public static String show(String dbUrl, String user, String pass, HashMap<String, String> cmdKv) {
        StringBuffer result = new StringBuffer();
        if(!checkConnectInfo(dbUrl,user,pass)){
            System.out.println("数据库连接信息错误,db_url:"+dbUrl+",user:"+user+",pass:xxxxx");
            return "数据库连接信息错误,db_url:"+dbUrl+",user:"+user+",pass:xxxxx";
        }

        if(cmdKv==null){
            System.out.println("命令不能为空");
            return "命令不能为空";
        }
        if(cmdKv.size()==1){
            System.out.println(cmdKv);
        }else{
            System.out.println("只能传一个key");
            return "只能传一个key";
        }
        String sqls="";
        Iterator<String> iterator = cmdKv.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            sqls=cmdKv.get(key);

        }
        String[] sqlArr=sqls.split("@#@");
        for(int j=0;j<sqlArr.length;j++){
            String cmd=sqlArr[j];
            if(cmd==null||cmd.trim().equals("")){
                System.out.println("命令不能为空");
                return "命令不能为空";
            }
            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("drop")){
                System.out.println("命令不能drop开头");
                return "命令不能drop开头";
            }
            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("delete")){
                System.out.println("命令不能delete开头");
                return "命令不能delete开头";
            }
//            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("insert")){
//                System.out.println("命令不能insert开头");
//                return "命令不能insert开头";
//            }
            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("truncate")){
                System.out.println("命令不能truncate开头");
                return "命令不能truncate开头";
            }
            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("alter table")){
                System.out.println("命令不能alter table开头");
                return "命令不能alter table开头";
            }

        }
        for(int j=0;j<sqlArr.length;j++){
            System.out.println("show sql:"+sqlArr[j]);
            result.append("show sql:"+sqlArr[j]+"\n");
        }
        return result.toString()+"\n\n";
    }

    public static String execute(String dbUrl, String user, String pass, HashMap<String, String> cmdKv) {
        StringBuffer result = new StringBuffer();
        if(!checkConnectInfo(dbUrl,user,pass)){
            System.out.println("数据库连接信息错误,db_url:"+dbUrl+",user:"+user+",pass:xxxxx");
            return "数据库连接信息错误,db_url:"+dbUrl+",user:"+user+",pass:xxxxx";
        }

        if(cmdKv==null){
            System.out.println("命令不能为空");
            return "命令不能为空";
        }
        if(cmdKv.size()==1){
            System.out.println(cmdKv);
        }else{
            System.out.println("只能传一个key");
            return "只能传一个key";
        }
        String sqls="";
        Iterator<String> iterator = cmdKv.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            sqls=cmdKv.get(key);

        }
        String[] sqlArr=sqls.split("@#@");
        for(int j=0;j<sqlArr.length;j++){
            String cmd=sqlArr[j];
            if(cmd==null||cmd.trim().equals("")){
                System.out.println("命令不能为空");
                return "命令不能为空";
            }
            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("drop")){
                System.out.println("命令不能drop开头");
                return "命令不能drop开头";
            }
            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("delete")){
                System.out.println("命令不能delete开头");
                return "命令不能delete开头";
            }
//            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("insert")){
//                System.out.println("命令不能insert开头");
//                return "命令不能insert开头";
//            }
            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("truncate")){
                System.out.println("命令不能truncate开头");
                return "命令不能truncate开头";
            }
            if(cmd.trim().toLowerCase().replaceAll(" ","").startsWith("alter table")){
                System.out.println("命令不能alter table开头");
                return "命令不能alter table开头";
            }

        }
        Connection conn = null;
        Statement stmt = null;
        try{
            // 注册 JDBC 驱动
            Class.forName(JDBC_DRIVER);
            // 打开链接
            System.out.println("连接数据库...,db_url:"+dbUrl);
            result.append("连接数据库...,db_url:"+dbUrl+"\n");
            conn = DriverManager.getConnection(dbUrl,user,pass);
            // 执行查询
            System.out.println("实例化Statement对象...");
            result.append("实例化Statement对象...\n");
            stmt = conn.createStatement();
            for(int j=0;j<sqlArr.length;j++){
                System.out.println("run sql:"+sqlArr[j]);
                result.append("run sql:"+sqlArr[j]+"\n");
                if(sqlArr[j].trim().toLowerCase().startsWith("select")){
                    ResultSet rs=stmt.executeQuery(sqlArr[j]);
                    ResultSetMetaData rsmd = rs.getMetaData();
                    if(rs.getFetchSize()<50){
                        // 遍历结果集
                        int kk=0;
                        while (rs.next()) {
                            for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                                // 获取每一列的值
                                Object value = rs.getObject(i);
                                // 打印列的值
                                System.out.print(rsmd.getColumnName(i) + ":" + value + "\t");
                            }
                            System.out.println();
                            if(kk>50){
                                System.out.println("result data >50 rows,not show");
                                break;
                            }
                            kk++;
                        }
                    }
                }else{
                    Boolean exeRes=stmt.execute(sqlArr[j]);
                }



            }
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 处理 JDBC 错误
            se.printStackTrace();
            result.append(se.getMessage()+"...\n");
        }catch(Exception e){
            // 处理 Class.forName 错误
            e.printStackTrace();
            result.append(e.getMessage()+"...\n");
        }finally{
            // 关闭资源
            try{
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
                result.append(se2.getMessage()+"...\n");
            }// 什么都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
                result.append(se.getMessage()+"...\n");
            }
        }
        System.out.println("goodbye!");
        return result.toString()+"\n\n";

    }
    public static void main(String[] args) {

    }
}

